import axios from 'axios';
import { message } from 'antd';
const restErrorMaps = {
  // Successful 2xx  成功
  200: { value: 'OK', label: '成功' }, // OK
  201: { value: 'Created', label: '创建' }, // 创建
  202: { value: 'Accepted', label: '已接受' }, // 已接受
  203: { value: 'Non-Authoritative Information', label: '非权威信息' }, // 非权威信息
  204: { value: 'No Content', label: '没有内容' }, // 没有内容
  205: { value: 'Reset Content', label: '重置内容' }, // 重置内容
  206: { value: 'Partial Content', label: '部分内容' }, // 部分内容

  // Redirection 3xx  重定向
  300: { value: 'Multiple Choices', label: '多种选择' }, // 多种选择
  301: { value: 'Moved Permanently', label: '永久移动' }, // 永久移动
  302: { value: 'Found', label: '找到' }, // 找到
  303: { value: 'See Other', label: '参见其他' }, // 参见其他
  304: { value: 'Not Modified', label: '未修改' }, // 未修改
  305: { value: 'Use Proxy', label: '使用代理' }, // 使用代理
  306: { value: 'Unused', label: '未使用' }, // 未使用
  307: { value: 'Temporary Redirect', label: '暂时重定向' }, // 暂时重定向

  // Client Error 4xx  客户端错误
  400: { value: 'Bad Request', label: '错误的请求' }, // 错误的请求
  401: { value: 'Unauthorized', label: '未经授权' }, // 未经授权
  402: { value: 'Payment Required', label: '付费请求' }, // 付费请求
  403: { value: 'Forbidden', label: '禁止' }, // 禁止
  404: { value: 'Not Found', label: '没有找到' }, // 没有找到
  405: { value: 'Method Not Allowed', label: '方法不允许' }, // 方法不允许
  406: { value: 'Not Acceptable', label: '不可接受' }, // 不可接受
  407: { value: 'Proxy Authentication Required', label: '需要代理身份验证' }, // 需要代理身份验证
  408: { value: 'Request Timeout', label: '请求超时' }, // 请求超时
  409: { value: 'Conflict', label: '指令冲突' }, // 指令冲突
  410: { value: 'Gone', label: '文档永久地离开了指定的位置' }, // 文档永久地离开了指定的位置
  411: { value: 'Length Required', label: '需要Content-Length头请求' }, // 需要Content-Length头请求
  412: { value: 'Precondition Failed', label: '前提条件失败' }, // 前提条件失败
  413: { value: 'Request Entity Too Large', label: '请求实体太大' }, // 请求实体太大
  414: { value: 'Request-URI Too Long', label: '请求URI太长' }, // 请求URI太长
  415: { value: 'Unsupported Media Type', label: '不支持的媒体类型' }, // 不支持的媒体类型
  416: {
    value: 'Requested Range Not Satisfiable',
    label: '请求的范围不可满足',
  }, // 请求的范围不可满足
  417: { value: 'Expectation Failed', label: '期望失败' }, // 期望失败

  // Server Error 5xx  服务器错误
  500: { value: 'Internal Server Error', label: '内部服务器错误' }, // 内部服务器错误
  501: { value: 'Not Implemented', label: '未实现' }, // 未实现
  502: { value: 'Bad Gateway', label: '错误的网关' }, // 错误的网关
  503: { value: 'Service Unavailable', label: '服务不可用' }, // 服务不可用
  504: { value: 'Gateway Timeout', label: '网关超时' }, // 网关超时
  505: { value: 'HTTP Version Not Supported', label: 'HTTP版本不支持' }, // HTTP版本不支持
};
// axios报错类
const axiosErrorMaps = [
  {
    value: 'timeout',
    label: '请求超时',
  },
  {
    value: 'Network Error',
    label: '网络异常',
  },
  {
    value: 'Request aborted',
    label: '请求中断',
  },
];

const axiosInstance = axios.create({
  timeout: 0,
  baseURL: '/',
  validateStatus(status) {
    return status >= 200 && status < 300;
  },
});

// 可自定义返回数据的拦截，以及错误信息的提示，以满足多类型的接口场景
export function request({
  onRes,
  errTipOpen = true,
  errTipPrefix = 'errTipPrefix',
  errTipNormal = '未知',
} = {}) {
  const requestWrapper = options =>
    axiosInstance(options)
      .then(res => {
        return onRes ? onRes(res) : res;
      })
      .catch(error => {
        if (errTipOpen) {
          const { response, errTip } = error || {};
          const errorContent = error ? error.toString() : '';
          const { status } = response || {};
          const { label: restfulErrorTip } = restErrorMaps[status] || {};
          const { label: axiosErrorTip } =
            axiosErrorMaps.find(axiosError => {
              const { value } = axiosError || {};
              return errorContent.includes(value);
            }) || {};
          const errTipNext =
            errTip || restfulErrorTip || axiosErrorTip || errTipNormal;
          message.error([errTipPrefix, errTipNext].filter(Boolean).join(','));
        }
        return Promise.reject(error);
      });
  return requestWrapper;
}

// 返回一个默认的请求函数，以满足常用接口类型
const defaultRequest = request({
  onRes(response) {
    const { code, data, msg } = response?.data || {};
    if (code === 0) {
      return Promise.resolve(data);
    }
    // 把错误抛出去，统一处理
    const error = new Error();
    error.response = response;
    error.errTip = msg;
    return Promise.reject(error);
  },
  errTipOpen: true, // 是否开启全局错误提示
  errTipPrefix: '接口异常', // 全局错误提示的前缀信息
});

export default defaultRequest;
